package com.young.pattern.builderPattern;

/**
 * 建造者模式客户端操作:
 */
public class client {


    /**
     * 建造者模式:
     *  将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示.
     *  建造者模式是一种对象创建型模式,他将客户端与包含多个部件的复杂对象的创建过程分离,客户端无需知道复杂对象的内部组成部分与装配方式,
     *  只需要知道所需建造者的类型即可.建造者模式关注如何一步一步的创建一个复杂对象,不同的建造者定义了不同的创建过程.
     * 结构:
     *  1,抽象建造者:为创建一个产品对象的哥哥部件指定抽象接口,在该接口中一般声明两类方法,一类方法是buildPartX()他们用于侯建复杂对象的各个部件;
     *      另一类方法是getResult(),他们用于返回复杂对象.Builder既可以是抽象类,也可以是接口.
     *  2,具体建造者:实现了Builder接口,实现各个部件的具体构造和装配方法,定义并明确所创建的复杂对象,还可以提供一个方法返回创建好的复杂对象,还可以
     *      提供一个方法返回创建好的复杂产品对象.
     *  3,产品:被构建的复杂对象,包含多个组成部件,具体建造者创建该产品的内部表示并定义他的装配过程;
     *  4,指挥者:指挥者又称导演类,负责安排复杂对象的建造次序,指挥者与抽象建造者之间存在关联关系,可以在其construct()建造方法中调用建造者对象的部件构造
     *      与装配方法,完成复杂对象的建造.客户端一般只需要与指挥者进行交互,在客户端确定具体建造者的类型,并实例化具体建造者对象.然后通过指挥者类的构造函数或者
     *      setter方法将该对象传入指挥者类中.
     *
     * 优点:
     *  1,在建造者模式中,客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象;
     *  2,每一个具体建造者都相对独立,而与其他的具体建造者无关.因此可以很方便的替具体建造者或增加新的具体建造者,用户使用不同的具体建造者可得到不同的产品对象.由于指挥者类
     *      针对抽象建造者编程,增加新的具体建造者无须修改原有类库的代码,系统扩展方便,符合开闭原则.
     *  3,可以更加精细的控制产品的创建过程.将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也方便使用程序来控制创建过程.
     *
     *  缺点:
     *   1,建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,例如很多组成部分都不相同,不适合使用建造者模式,因此其使用范围受到一定的限制;
     *   2,如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大,增加系统的理解难度和运行成本.
     *
     */

    public static void main(String[] args) {
        ActorBuilder actorBuilder = new AngelActorBuilder();
        ActorController actorController = new ActorController();
        Actor actor = actorController.construct(actorBuilder);
        System.out.println(actor.toString());
    }

}
